package map;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * java.util.Map 查找表
 * Map体现的样子像一个多行两列的表格。
 * 其中左列称为key，右列称为value
 * Map总是以key-value对形式保存数据
 * Map总是根据key获取对应的value
 * Map中的key不允许重复(equals比较)
 *
 * 常用实现类:
 * java.util.HashMap:使用散列算法实现的Map。通常称它为散列表，最常用的Map
 * java.util.LinkedHashMap:内部使用一个链表维护了遍历顺序(遍历顺序与存入时顺序一致)的HashMap
 * java.util.TreeMap:使用二叉树算法实现的Map
 */
public class MapDemo1 {
    public static void main(String[] args) {
        Map<String,Integer> map = new HashMap<>();
        //LinkedHashMap能保证遍历顺序与put时顺序一致
//        Map<String,Integer> map = new LinkedHashMap<>();
        /*
            V put(K k,V v)
            将给定的键值对存入Map
            Map要求key不允许重复，返回值表示:如果使用已经存在的key存入新的value，则是
            替换value操作，此时会将被替换的value返回。
            如果存入的key在map中不存在，则返回值为null(表示没有被替换的值)
         */
        Integer value = map.put("语文",99);//没有替换时返回值为null
        //注意:如果value是包装类，接收返回值也应当用包装类，避免自动拆箱导致空指针
//        int value = map.put("语文",99);//自动拆箱:int value = map.put("语文",99).intValue();
        System.out.println(value);
        map.put("数学",98);
        map.put("英语",97);
        map.put("物理",96);
        map.put("化学",99);
        System.out.println(map);

        //重复的key则是替换value操作，返回值是被替换的value
        value = map.put("数学",70);
        System.out.println(map);
        System.out.println(value);
        //size用于返回Map元素个数，一组键值对为一个元素
        int size = map.size();
        System.out.println("size:"+size);
        /*
            V get(Object key)
            根据给定的key获取对应的value
            如果给定的key在Map中不存在则返回值为null
         */
        value = map.get("英语");
        System.out.println("英语:"+value);
        value = map.get("体育");
        System.out.println("体育:"+value);

        /*
            boolean containsKey(Object key)
            判断当前Map是否包含指定的key
            boolean containsValue(Object value)
            判断当前Map是否包含指定的value
         */
//        boolean ck = map.containsKey("语文");
        boolean ck = map.containsKey("体育");
        System.out.println("包含key:"+ck);

        boolean cv = map.containsValue(99);
        System.out.println("包含value:"+cv);


        /*
            V remove(Object key)
            根据给定的key删除对应的键值对，返回值为这个key对应的value
         */
        value = map.remove("语文");
        System.out.println(map);
        System.out.println(value);

    }
}



